<?php

namespace app\index\controller;

use think\Controller;
use \Firebase\JWT\JWT;
use think\Request;
use app\index\validate\UserC;
use app\index\model\User;
use app\index\controller\Base;

class Index extends Base
{

    /**
     * 登录
     *
     * @param Type $request 依赖注入
     * @return void
     */
    public function login(Request $request)
    {

        if ($request->instance()->isPost()) {
            $data = input('post.');
            $result = (new UserC)->check($data);
            if (true !== $result) {
                return $this->errorReturn('用户名或者密码格式不正确！', '4005');
            }
            // 用户判断
            $has = (new User)->findByAttributes(['user_name' => $data['user_name']]);
            if (!$has) {
                return $this->errorReturn('用户名或者密码不正确！', '4003');
            }

            //密码判断
            if ($has['user_pwd'] != $data['user_pwd']) {
                return  $this->errorReturn('用户名或者密码不正确！', '4003');
            }

            $resData['token'] = $this->getToken($has['user_id']);
            return $this->SuccessReturn('登录成功', $resData);
        }
    }


    /**
     * 用户注册
     *
     * @param Request $request
     * @return void
     */
    public function regUser(Request $request)
    {
        if ($request->instance()->isPost()) {

            $data = $request->instance()->post();
            $result = (new UserC)->check($data);
            if (true !== $result) {
                return $this->errorReturn('请按规定传入参数', '4005');
            }
            //检测用户是否有重复名
            if ((new User)->findByAttributes($data)) {
                return $this->errorReturn('用户名存在', '4005');
            }

            $res = (new User)->insert($data);
            return  $res ? $this->SuccessReturn('注册成功', $res) : $this->errorReturn('请按规定传入参数', '4005');
        }
    }

    /**
     * 用户修改
     *
     * @return void
     */
    public function editUser(Request $request)
    {
        if ($request->instance()->isPost()) {

            $data = input('post.');
            unset($data['token']);
            $res = (new User)->updateByWhere(['user_id' => $data['user_id']], $data);
            return $res ? $this->SuccessReturn('修改成功') : $this->errorReturn('修改失败，请按规定传入参数', '4005');
           
        }
    }
    /**
     * 用户删除
     *
     * @return void
     */
    public function delUser(Request $request)
    {
        $data = input('post.');
        if ($request->instance()->isPost()) {
                unset($data['token']);
                $user_id = input('user_id');
            $res = (new User)->deleteByWhere(['user_id' => $user_id]);
            return  $res ? $this->SuccessReturn('删除成功') : $this->errorReturn('删除失败', '4005');
        }
    }


    /**
     * 统一成功返回
     *
     * @param [type] $data 数据
     * @param [type] $msg  信息
     * @return void
     */
    public function SuccessReturn($msg, $data = null)
    {
        return json(['status' => 'success', 'code' => 200, 'msg' => $msg, 'data' => $data]);
    }
    /**
     * 统一接口返回错误
     *
     * @param [type] $data 数据
     * @param [type] $msg  信息
     * @param [type] $code 错误码
     * @return void
     */
    public function errorReturn($msg, $code)
    {
        return json(['status' => 'error', 'code' => $code, 'msg' => $msg]);
    }

    /**
     * token生成
     *
     * @param [type] $user_id
     * @return void
     */
    public function getToken($user_id)
    {
        $key = '$2y$10$sGrzsiE4SsuFJq4G9S9nTOkifq5kNzILIHU4MeCuvHUWvGoAxCLAi';  //秘钥 开发项目时应放在配置中
        $token = [
            "iss" => "",  //签发者  开发项目时应放在配置中
            "aud" => "", //面象的用户， 开发项目时应放在配置中
            "iat" => time(), //签发时间 开发项目时应放在配置中
            "nbf" => time(), //在什么时候jwt开始生效  开发项目时应放在配置中
            "exp" => time() + 7200, //token 过期时间 开发项目时应放在配置中
            "uid" => $user_id //用户ID
        ];

        return  $jwt = JWT::encode($token, $key, "HS256"); //根据参数生成了 token
    }
    /**
     * token验证
     *
     * @return void
     */
    public function check()
    {
        $jwt = input("token");
        $key = "test123";
        $info = JWT::decode($jwt, $key, ["HS256"]); //解密jwt
        return $info;
    }
}
